暴力解法
js
/**
* @param {string} s
* @param {number} numRows
* @return {string}
*/
var convert = function (s, numRows) {
if (numRows === 1) {
return s
}
let result = ''
let arr = new Array(numRows).fill().map((item) => [])
let i = 0,
j = 0
let direction = 0 // 0 竖 1 斜上
const sToArr = s.split('')
sToArr.forEach((item) => {
arr[i][j] = item
if (i === 0) {
direction = 0
}
if (i === numRows - 1) {
direction = 1
}
if (!direction) {
i++
} else {
j++
i--
}
})
arr.forEach((item) => {
result += item.join('')
})
return result
}
题解
以 V 字型为一个循环, 循环周期为 n = (2 * numRows - 2) (2 倍行数 - 头尾 2 个)。
对于字符串索引值 i,计算 x = i % n 确定在循环周期中的位置。
则行号 y = min(x, n - x)。
js
/**
* @param {string} s
* @param {number} numRows
* @return {string}
*/
var convert = function (s, numRows) {
if (numRows === 1) return s
const rows = new Array(numRows).fill('')
const n = 2 * numRows - 2
for (let i = 0; i < s.length; i++) {
const x = i % n
rows[Math.min(x, n - x)] += s[i]
}
return rows.join('')
}